package edu.yonsei.iwb.smarttv.result;

import com.hp.hpl.jena.rdf.model.Resource;

/**
 * 사용자의 질의로부터 식별된 하나의 개체(인스턴스)에 대한 정보를 저장하기 위한 클래스로써, 개체에 대한 정보와 해당 개체의 타입 정보를 담고 있는 클래스
 *
 * @author 이명진
 * @version 1.0, 2011.9.8
 */
public class NamedEntity {

    /**
     * 식별된 인스턴스
     */
    private ResultNode node;
    /**
     * 인스턴스에 대한 타입 정보
     */
    private ResultTypeInfo type;

    public NamedEntity(Resource r) {
        this.node = new ResultNode(r);
        this.type = new ResultTypeInfo(r);
    }
    
    public NamedEntity(String uri, String label, ResultNode rn) {
        this.node = new ResultNode(uri, label);        
        this.type = new ResultTypeInfo(rn);
    }

    /**
     * 사용자의 질의로부터 식별된 인스턴스에 대한 정보를 반환하는 메소드
     *
     * @return 개체 식별 결과 인스턴스의 URI와 Label을 저장하고 있는 ResultNode 객체를 반환
     */
    public ResultNode getNamedEntityNode() {
        return this.node;
    }

    /**
     * 사용자의 질의로부터 식별된 인스턴스에 대한 URI 정보를 반환하는 메소드
     *
     * @return 개체 식별 결과 인스턴스의 URI를 반환
     */
    public String getNamedEntityNodeId() {
        return this.node.getResultNodeId();
    }

    /**
     * 사용자의 질의로부터 식별된 인스턴스에 대한 Label 정보를 반환하는 메소드
     *
     * @return 개체 식별 결과 인스턴스의 Label을 반환
     */
    public String getNamedEntityNodeLabel() {
        return this.node.getLabel();
    }

    /**
     * 개체 식별 결과 인스턴스의 type 정보를 반환하기 위한 메소드로써 예를 들어, (A rdf:type ?x)에 대해 ?x에 대한 정보를 반환하는 메소드
     *
     * @return 타입 정보를 저장하고 있는 ResultTypeInfo 객체를 반환
     */
    public ResultTypeInfo getResultTypes() {
        return this.type;
    }

    /**
     * 개체 식별 결과 인스턴스가 가지고 있는 타입 정보의 개수를 반환하는 메소드
     *
     * @return 타입 정보의 개수를 반환
     */
    public int sizeOfResultType() {
        return this.type.size();
    }

    /**
     * 개체 식별 결과 인스턴스가 가지고 있는 타입 정보 중 인덱스에 해당하는 타입 정보를 반환
     *
     * @param i 타입 정보를 얻기 위한 인덱스
     * @return i 번째 타입 정보를 ResultNode 객체로 반환
     */
    public ResultNode getResultType(int i) {
        return this.type.get(i);
    }

    public boolean isOWLProperty() {
        return this.type.isOWLProperty();
    }

    public boolean isClass() {
        return this.type.isClass();
    }

    @Override
    public String toString() {
        StringBuffer sb = new StringBuffer();
        sb.append(this.node.toString());
        sb.append(this.type.toString());
        return sb.toString();
    }
}
